gusucode.com > Ado 实现C++对象的存取C#源码程序 > Ado 实现C++对象的存取/adocppobj/adocppobj/TestAdoDlg.cpp
// TestAdoDlg.cpp : implementation file // #include "stdafx.h" #include "TestAdo.h" #include "TestAdoDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestAdoDlg dialog CTestAdoDlg::CTestAdoDlg(CWnd* pParent /*=NULL*/) : CDialog(CTestAdoDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTestAdoDlg) m_nWidth = 0; m_sName = _T("test"); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pCon = NULL; m_pSet = NULL; m_bState = FALSE; m_Line.Clear(); } void CTestAdoDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestAdoDlg) DDX_Control(pDX, IDC_LIST_DATA, m_List); DDX_Control(pDX, IDC_BUTTON_BK_COLOR, m_BtnBkColor); DDX_Control(pDX, IDC_BUTTON_COLOR, m_BtnColor); DDX_Text(pDX, IDC_EDIT_WIDTH, m_nWidth); DDX_Text(pDX, IDC_EDIT_NAME, m_sName); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTestAdoDlg, CDialog) //{{AFX_MSG_MAP(CTestAdoDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CLOSE() ON_EN_UPDATE(IDC_EDIT_WIDTH, OnUpdateEditWidth) ON_WM_LBUTTONDOWN() ON_BN_CLICKED(IDC_BUTTON_SAVE, OnButtonSave) ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear) ON_LBN_SELCHANGE(IDC_LIST_DATA, OnSelchangeListData) //}}AFX_MSG_MAP ON_MESSAGE( CPN_SELENDOK, OnSelEndOK ) ON_MESSAGE( CPN_SELCHANGE, OnSelEndOK ) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestAdoDlg message handlers BOOL CTestAdoDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here CString filename = GetAppPath() + "db.mdb"; m_bState=OpenDb(filename); if (m_bState) LoadDbData(); m_BtnBkColor.SetColor(m_Line.GetBkColor()); m_BtnColor.SetColor(m_Line.GetColor()); return TRUE; // return TRUE unless you set the focus to a control } void CTestAdoDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CTestAdoDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); CClientDC dc(this); // device context for painting CRect rc = GetRect(IDC_STATIC_RECT); m_Line.DrawBackGround(&dc,rc); m_Line.DrawPoint(&dc,rc); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CTestAdoDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } BOOL CTestAdoDlg::OpenDb(CString filename) { HRESULT hr=S_OK; hr=m_pCon.CreateInstance("ADODB.Connection"); if (hr!=S_OK) { return FALSE; } try { _bstr_t sCon; sCon=_bstr_t(filename); //路径名 sCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+sCon; hr=m_pCon->Open(sCon,"","",adModeUnknown); if (hr!=S_OK) { return FALSE; } /////////////////////// hr=m_pSet.CreateInstance("ADODB.Recordset"); if (hr!=S_OK) { return FALSE; } m_pSet->CursorLocation=adUseClient; hr=m_pSet->Open("SELECT * FROM object_table",_variant_t((IDispatch*)m_pCon,TRUE), adOpenStatic,adLockOptimistic,adCmdText); if (hr!=S_OK) { return FALSE; } return TRUE; /////////////////////// } catch(_com_error &e) { CString errorMessage; errorMessage.Format("连接数据库失败!错误信息:%s",e.ErrorMessage()); return FALSE; } return FALSE; } CString CTestAdoDlg::GetAppPath() { TCHAR sFilename[_MAX_PATH]; TCHAR sDrive[_MAX_DRIVE]; TCHAR sDir[_MAX_DIR]; TCHAR sFname[_MAX_FNAME]; TCHAR sExt[_MAX_EXT]; GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH); _tsplitpath(sFilename, sDrive, sDir, sFname, sExt); CString strPath = CString(sDrive) + CString(sDir); if (strPath.Right(1) != _T('\\')) strPath+= _T("\\"); return strPath; } void CTestAdoDlg::OnClose() { if (m_pCon->State) { m_pCon->Close(); m_pCon = NULL; } if (m_pSet->State) { m_pSet->Close(); m_pSet= NULL; } CDialog::OnClose(); } void CTestAdoDlg::OnSelEndOK(UINT lParam, LONG wParam) { switch( wParam ) { case IDC_BUTTON_BK_COLOR: { m_Line.SetBkColor(m_BtnBkColor.GetColor()); } case IDC_BUTTON_COLOR: { m_Line.SetColor(m_BtnColor.GetColor()); } break; } } void CTestAdoDlg::OnUpdateEditWidth() { UpdateData(); m_Line.SetWidth(m_nWidth); } CRect CTestAdoDlg::GetRect(UINT ID) { CRect rc; GetDlgItem(ID)->GetWindowRect(&rc); ScreenToClient(&rc); return rc ; } void CTestAdoDlg::OnLButtonDown(UINT nFlags, CPoint point) { CRect rc = GetRect(IDC_STATIC_RECT); if (rc.PtInRect(point)) { if (m_Line.GetSize()>0) { CPoint pt1 = m_Line.GetPoint(m_Line.GetSize()-1); CClientDC dc(this); // device context for painting m_Line.DrawLine(&dc,pt1,point,rc); } m_Line.AddPoint(point); } CDialog::OnLButtonDown(nFlags, point); } void CTestAdoDlg::OnButtonSave() { //m_List if (!m_bState) return; UpdateData(); try { m_pSet->AddNew(); m_pSet->PutCollect("name", _variant_t(m_sName)); //保存图形对象 CMemFile memFile; CArchive ar(&memFile, CArchive::store); m_Line.Serialize(ar); ar.Close(); DWORD dwSize = memFile.GetLength(); LPBYTE lpInfo = memFile.Detach(); VARIANT varBLOB; SAFEARRAY *psa; SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0; rgsabound[0].cElements = dwSize; psa = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < (long)dwSize; i++) { SafeArrayPutElement (psa, &i, lpInfo++); } varBLOB.vt = VT_ARRAY | VT_UI1; varBLOB.parray = psa; m_pSet->GetFields()->GetItem("object")->AppendChunk(varBLOB); m_pSet->Update(); m_List.AddString(m_sName); } catch(_com_error &e) { CString str=(char *)e.Description(); MessageBox(str+"\r保存数据库出问题!","提示",MB_OK|MB_ICONWARNING); return ; } } void CTestAdoDlg::OnButtonClear() { m_Line.Clear(); CRect rc = GetRect(IDC_STATIC_RECT); InvalidateRect(rc); } void CTestAdoDlg::LoadDbData() { _variant_t vData; m_pSet->MoveFirst(); while (!m_pSet->adoEOF) { vData=m_pSet->GetCollect(_variant_t("name")); if (vData.vt!=VT_NULL) { m_List.AddString((LPCTSTR)(_bstr_t)vData); } m_pSet->MoveNext(); } } void CTestAdoDlg::OnSelchangeListData() { int iPos = m_List.GetCurSel(); if (iPos<0) return ; m_pSet->MoveFirst(); int i=0; while (i< iPos) { m_pSet->MoveNext(); i++; } long lDataSize = m_pSet->GetFields()->GetItem(_variant_t("object"))->ActualSize; if(lDataSize <= 0) return; _variant_t varBLOB; VariantInit (&varBLOB); varBLOB = m_pSet->GetFields()->GetItem(_variant_t("object"))->GetChunk(lDataSize); if(varBLOB.vt == (VT_ARRAY | VT_UI1)) { BYTE *pBuf = new BYTE[lDataSize + 1]; if(pBuf) { SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); SafeArrayUnaccessData (varBLOB.parray); CMemFile memfile; memfile.Attach(pBuf,lDataSize); memfile.SeekToBegin(); CArchive ar(&memfile, CArchive::load); m_Line.Serialize(ar); ar.Close(); memfile.Detach(); CRect rc = GetRect(IDC_STATIC_RECT); InvalidateRect(rc); } } VariantClear (&varBLOB); }